约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
以下是代码实现(c语言)
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int date;
struct node *next;
}node,*linklist;
linklist creat(int n)
{
linklist p=NULL,head;
head=(linklist)malloc(sizeof(node));//建立头结点
p=head;//p为指向当前节点的指针
linklist s;
int i=1;
if(n!=0)
{
while(i<=n)
{
s=(linklist)malloc(sizeof(node));
s->date=i++;
p->next=s;
p=s;
}
s->next=head->next;//首尾相连,头结点可以直接删掉,指向的是head->next,而不是head因为头结点里没有数据
}
free(head);
return s->next;
}
int main()
{
int n=41;
int m=3;
int i;
linklist p=creat(n);
linklist temp;
m%=n;
while(p!=p->next)
{
for(i=1;i<m-1;i++)
{
p=p->next;
}
printf("%d->",p->next->date);
temp=p->next;
p->next=temp->next;//连接2,4结点, 一般要删除一个结点的时候一定要注意最后要接上去
free(temp);
p=p->next;
}
printf("%d\n",p->date);
return 0;
system("pause");
}